home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Trusted Irix /B 4.0.4
/
Trusted-Irix B-4.0.1.iso
/
dist
/
eoe1.idb
/
usr
/
include
/
sys
/
pfdat.h.z
/
pfdat.h
Wrap
C/C++ Source or Header
|
1992-04-03
|
7KB
|
188 lines
/**************************************************************************
* *
* Copyright (C) 1989, Silicon Graphics, Inc. *
* *
* These coded instructions, statements, and computer programs contain *
* unpublished proprietary information of Silicon Graphics, Inc., and *
* are protected by Federal copyright law. They may not be disclosed *
* to third parties or copied or duplicated in any form, in whole or *
* in part, without the prior written consent of Silicon Graphics, Inc. *
* *
**************************************************************************/
/* Copyright (c) 1984 AT&T */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
#ifndef __SYS_PFDAT_H__
#define __SYS_PFDAT_H__
#ident "$Revision: 3.28 $"
#include "sys/sema.h"
typedef struct pfdat { /* pf_next and pf_prev MUST be first. */
struct pfdat *pf_next; /* Next free pfdat. */
struct pfdat *pf_prev; /* Previous free pfdat. */
unsigned pf_pageno : 24, /* Disk block number. */
pf_flags : 8; /* Page flags. */
union {
struct inode *ip; /* Page's incore inode. */
struct {
short indx; /* Index into swaptab. */
dev_t dev; /* Swap device. */
} swap;
} p_un;
cnt_t pf_use; /* Share use count. */
unsigned short pf_rawcnt; /* Count of processes */
/* doing raw I/O to page*/
time_t pf_start; /* Timestamp for delwri.*/
struct pfdat *pf_hchain; /* Hash chain link. */
struct pfdat *pf_pchain; /* I/O queue. */
} pfd_t;
/*
* pf_ip and {pf_dev,pf_swpi} are overloaded because the ip
* is never used when swapping to a physical partition.
*/
#define pf_ip p_un.ip
#define pf_dev p_un.swap.dev
#define pf_swpi p_un.swap.indx
/*
* pf_flags flags
*/
#define P_QUEUE 0x01 /* Page on free queue */
#define P_BAD 0x02 /* Bad page (parity error, etc.)*/
#define P_HASH 0x04 /* Page on hash queue */
#define P_DONE 0x08 /* I/O to read page is done. */
#define P_SWAP 0x10 /* Page on swap (not file). */
#define P_WAIT 0x20 /* Waiting for P_DONE */
#define P_LOCK 0x40 /* Page manipulation lock. */
#define P_DELWRI 0x80 /* Delayed write page */
#define PAGELOCK(P) (P)->pf_flags |= P_LOCK
#define PAGEUNLOCK(P) (P)->pf_flags &= ~P_LOCK
#define ISPAGELOCKED(P) ((P)->pf_flags & P_LOCK)
/*
* The six free page lists define the state of the page, I-cache wise
*/
#define CLEAN_ASSOC 0 /* Clean, disk association */
#define INTRANS_ASSOC 1 /* Being cleaned, no disk association */
#define STALE_ASSOC 2 /* Stale, disk association */
#define CLEAN_NOASSOC 3 /* Clean, no disk association */
#define INTRANS_NOASSOC 4 /* Being cleaned, disk association */
#define STALE_NOASSOC 5 /* Stale, no disk association */
#define PH_NLISTS 6
/*
* List header type for free page table -- match link pointers in pfd_t.
*/
typedef struct plist {
struct pfdat *pf_next;
struct pfdat *pf_prev;
} plist_t;
/*
* Free page table entry
*/
typedef struct phead {
plist_t ph_list[PH_NLISTS]; /* list headers */
int ph_count; /* total count on all lists */
int dummy[3];
} phead_t;
/*
* Page wait semaphores.
*/
typedef struct pagewait {
sema_t pwt_sema; /* page wait semaphore */
int pwt_count; /* wait counter */
uint pwt_waiters; /* wait stats */
uint pwt_wakers; /* wake stats */
} pfdwt_t;
#ifdef _KERNEL
extern sema_t pinsert_lock; /* lock on page hash additions */
extern sema_t swapsema; /* semaphore for all swap entries */
extern lock_t memory_lock; /* lock for manipulationg memory*/
extern pfd_t *pfdat; /* page frame database -- */
/* allocated at bootup */
extern phead_t *phead; /* free page headers */
extern pfdwt_t *pfdwait; /* page wait semaphores */
extern pfd_t **phash; /* hash buckets for active pages*/
extern pfd_t **phashlast; /* last hash bucket */
extern int pheadmask; /* free page hash mask */
extern int phashmask; /* active page hash mask */
extern int pwaitmask; /* page wait semaphore mask */
extern int pdwrimem; /* count of delayed write pages */
extern sema_t upage_lock; /* lock for upage allocations */
extern unsigned int cflush_gen; /* cache flushing generation # */
#define pfdattophead(pfd) (&phead[((pfd_t *)pfd - pfdat) & pheadmask])
#define pfdattopwt(pfd) (&pfdwait[((pfd_t *)pfd - pfdat) & pwaitmask])
#define PHASH(PGNO,I) (phash[((PGNO) + ((long)(I)>>5)) & phashmask])
#define PDHASH(PGNO,I) (phash[((PGNO) + ((long)(I)>>5)) & phashmask])
#define NEXTPHASH(PL) ((PL) >= phashlast ? &phash[0] : ((PL) + 1))
#define PREVPDHASH(PL) ((PL) == &phash[0] ? phashlast : ((PL) - 1))
#define NEXTPDHASH(PL) ((PL) >= phashlast ? &phash[0] : ((PL) + 1))
#define PGNULL 0 /* pf_pageno null value */
#define pinsertlock() psema(&pinsert_lock, PMEM);
#define pinsertunlock() { ASSERT(valusema(&pinsert_lock) <= 0); \
vsema(&pinsert_lock); }
#define upagelock() psema(&upage_lock, PZERO);
#define upageunlock() { ASSERT(valusema(&upage_lock) <= 0); \
vsema(&upage_lock); }
#define swaplock() appsema(&swapsema, PSWP);
#define swapunlock() apvsema(&swapsema);
extern int splhi(void);
#define rawmemlock() splockspl(memory_lock, splhi)
#define rawmemunlock(T) spunlockspl(memory_lock, T)
#define vcache(key,lpn) (uint)(((uint)key >> 7) + lpn)
/* Function Prototypes */
extern pfd_t *pagealloc(uint, int);
extern int pagefree(pfd_t *);
extern pfd_t *pfind(struct region *, struct dbd *);
extern pfd_t *pifind(struct inode *, daddr_t, int);
extern pfd_t *pglock(pfd_t *);
extern pfd_t *pdhfind(pfd_t **, struct inode *, unsigned);
extern void pagewait(pfd_t *);
extern void pagedone(pfd_t *);
extern void pinsert(struct region *, struct dbd *, pfd_t *);
extern void piinsert(struct inode *, daddr_t, pfd_t *);
extern int premove(pfd_t *);
extern int pbremove(struct region *, struct dbd *);
extern int pattach(caddr_t);
extern void prelease(int);
extern int pflip(int, caddr_t);
extern void ptossip(struct inode *, int, int);
extern void pflushinvalip(struct inode *, int size);
extern void ppuship(struct inode *);
extern void pfluship(struct inode *, int);
extern void pinvalfree(struct inode *);
extern void pageuseinc(pfd_t *);
extern void pageacquire(pfd_t *);
extern void pageflags(pfd_t *, int, int);
extern void pdinsert(pfd_t *);
extern void delpop(struct inode *);
extern int reservermem(int);
extern int reservemem(int, int, int);
extern void waitrmem(int);
extern void unreservemem(int, int, int);
extern int requestmem(unsigned);
extern void cancelmem(unsigned);
extern void setsxbrk(struct proc *);
#endif /* _KERNEL */
#endif /* !__SYS_PFDAT_H__ */